package parse_and_index.search.inverted;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;

import parse_and_index.model.Page;

public class Score {
	  private int									   documentId;
	  private float									 value;
	  private final ArrayList<Page>					 mPages;
	  private final HashMap<Integer, ArrayList<String>> multipleQueryTokensOnPage;
	  private static final int						  HIT_SCORE_VALUE = 50;

	  public Score(final int id, final float score, final ArrayList<Page> pgs, final String prefix) {
			documentId = id;
			value = score;
			mPages = pgs;
			multipleQueryTokensOnPage = new HashMap<Integer, ArrayList<String>>();
			initHash(prefix);
	  }

	  public void addPages(final ArrayList<Page> pagesToAdd, final String prefix) {
			for (final Page page : mPages) {
				  final Iterator<Page> itererator = pagesToAdd.iterator();
				  while (itererator.hasNext()) {
						final Page pageToAdd = itererator.next();
						if (page.getPageNumber() == pageToAdd.getPageNumber()) {
							  ArrayList<String> list = new ArrayList<String>();
							  list = multipleQueryTokensOnPage.get(page.getPageNumber());
							  int a = pageToAdd.getHitCount();
							  if (!list.contains(prefix)) {
									a += HIT_SCORE_VALUE;
									list.add(prefix);
									multipleQueryTokensOnPage.put(pageToAdd.getPageNumber(), list);
							  }
							  a += page.getHitCount();
							  page.setHitCount(a);
							  itererator.remove();
						}
				  }
			}
			final ArrayList<String> pr = new ArrayList<String>();
			pr.add(prefix);
			for (int i = 0; i < pagesToAdd.size(); i++) {
				  multipleQueryTokensOnPage.put(pagesToAdd.get(i).getPageNumber(), pr);
			}
			mPages.addAll(pagesToAdd);
	  }

	  private void initHash(final String prefix) {
			final ArrayList<String> prefixList = new ArrayList<String>();
			prefixList.add(prefix);
			for (final Page page : mPages) {
				  multipleQueryTokensOnPage.put(page.getPageNumber(), prefixList);
			}
	  }

	  public void sortPagesByRelevance() {
			Collections.sort(mPages);
			Collections.reverse(mPages);
			// mPages = bubbleSort(mPages);
	  }

	  // private ArrayList<Page> bubbleSort(final ArrayList<Page> pagesToSort) {
	  // if (pagesToSort.size() < 2) { return pagesToSort; }
	  // ArrayList<Page> large = new ArrayList<Page>(), less = new ArrayList<Page>();
	  // final long pivotIndex = Math.round(Math.random() * (pagesToSort.size() - 1));
	  // final ArrayList<Page> pivot = new ArrayList<Page>();
	  // pivot.add(pagesToSort.get((int) pivotIndex));
	  // pagesToSort.remove((int) pivotIndex);
	  // for (int i = 0; i < pagesToSort.size(); i++) {
	  // if (pagesToSort.get(i).getHitCount() <= pivot.get(0).getHitCount()) {
	  // less.add(pagesToSort.get(i));
	  // }
	  // else {
	  // large.add(pagesToSort.get(i));
	  // }
	  // }
	  // less = bubbleSort(less);
	  // large = bubbleSort(large);
	  // less.addAll(pivot);
	  // less.addAll(large);
	  // return less;
	  // }

	  public int getDocumentId() {
			return documentId;
	  }

	  public void setDocumentId(final int documentId) {
			this.documentId = documentId;
	  }

	  public float getValue() {
			return value;
	  }

	  public void setValue(final float value) {
			this.value = value;
	  }

	  public ArrayList<Page> getPages() {
			return mPages;
	  }

	  @Override
	  public String toString() {
			String ret = "id: " + documentId + "\n";
			ret += mPages.get(0) + "\n";;
			for (int i = 1; i < mPages.size(); i++) {
				  ret += mPages.get(i) + ", " + "\n";
			}
			return ret;
	  }
}